home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / godelqc5.zip / GODEL.QC < prev    next >
Text File  |  1996-09-24  |  28KB  |  951 lines

  1. .float grenadetimer;
  2. .float numholo;//init
  3. .float nextregen;
  4.  
  5. entity newclient;
  6.  
  7. //prototypes
  8. float() crandom;
  9. void() GrenadeExplode;
  10. void() BecomeExplosion;
  11. void(string gibname,float dmg) ThrowGib;
  12. void(string gibname,float dmg) ThrowHead;
  13. void(vector p1, vector p2, entity from, float damage) LightningDamage;
  14. void() zombie_stand1;
  15. void() zombie_walk1;
  16. void() zombie_run1;
  17. void(entity attacker,float take) zombie_pain;
  18. void() zombie_paine1;
  19. void() zombie_die;
  20. void() zombie_missile;
  21. void() walkmonster_start_go;
  22.  
  23. //Make Thrown Ammo,Backpack,Gun pick uppable.   
  24. void() SUB_MakePickup = {
  25.     self.flags=FL_ITEM;
  26.     self.solid=SOLID_TRIGGER;
  27.     self.nextthink=time+600;
  28.     self.think=SUB_Remove;
  29. };
  30.  
  31. //Gib a Body into pieces after a while.
  32. void() SUB_Gib = {
  33.     ThrowGib("progs/gib1.mdl",10);
  34.     ThrowGib("progs/gib1.mdl",10);
  35.     ThrowGib("progs/gib2.mdl",10);
  36.     ThrowGib("progs/gib3.mdl",10);
  37.     ThrowHead("progs/h_player.mdl",10);
  38. };
  39.  
  40. //Used to toss a weapon, ammo, or armor.
  41. void(float ax) TossBackpack =
  42. {
  43.     local entity    item;
  44.     if (self.flags & FL_OBSERVER) return;
  45.     if (self.impulse==55) ax=0;
  46.     else if (self.impulse==56) ax=1;
  47.     else if (self.impulse==57) ax=32;
  48.     if (ax==0) {
  49.         if (self.weapon==IT_SUPER_SHOTGUN) ax=3;
  50.         if (self.weapon==IT_NAILGUN) ax=4;
  51.         if (self.weapon==IT_SUPER_NAILGUN) ax=5;
  52.         if (self.weapon==IT_GRENADE_LAUNCHER) ax=6;
  53.         if (self.weapon==IT_ROCKET_LAUNCHER) ax=7;
  54.         if (self.weapon==IT_LIGHTNING) ax=8;
  55.     }
  56.     if (ax==1) {
  57.         if (self.weapon==IT_SHOTGUN) ax=16;
  58.         if (self.weapon==IT_SUPER_SHOTGUN) ax=16;
  59.         if (self.weapon==IT_NAILGUN) ax=17;
  60.         if (self.weapon==IT_SUPER_NAILGUN) ax=17;
  61.         if (self.weapon==IT_GRENADE_LAUNCHER) ax=18;
  62.         if (self.weapon==IT_ROCKET_LAUNCHER) ax=18;
  63.         if (self.weapon==IT_LIGHTNING) ax=19;
  64.     }
  65.     if (ax==2) {
  66.         if (!(self.ammo_shells+self.ammo_nails+self.ammo_rockets+self.ammo_cells))
  67.             return;    // nothing in it
  68.         item = spawn();
  69.         item.owner = self;
  70.         item.items = 0;
  71.         setmodel (item, "progs/backpack.mdl");
  72.         setsize (item, '-16 -16 0', '16 16 56');
  73.         item.touch = BackpackTouch;
  74.         item.ammo_shells = self.ammo_shells;
  75.         item.ammo_nails = self.ammo_nails;
  76.         item.ammo_rockets = self.ammo_rockets;
  77.         item.ammo_cells = self.ammo_cells;
  78.         item.classname="backpack";
  79.         self.ammo_shells = 0;
  80.         self.ammo_nails = 0;
  81.         self.ammo_rockets = 0;
  82.         self.ammo_cells = 0;    
  83.     } else if (ax==3) {
  84.         if (!(self.items & IT_SUPER_SHOTGUN)) return;
  85.         item = spawn();
  86.         item.owner = self;
  87.         item.items = IT_SUPER_SHOTGUN;
  88.         self.items = self.items - IT_SUPER_SHOTGUN;
  89.         if (self.weapon==IT_SUPER_SHOTGUN) self.weapon=W_BestWeapon();
  90.         setmodel (item, "progs/g_shot.mdl");
  91.         setsize (item, '-16 -16 0', '16 16 56');
  92.         item.touch = BackpackTouch;
  93.         if (self.ammo_shells < 10)
  94.         item.ammo_shells = self.ammo_shells;
  95.         else    item.ammo_shells = 10;
  96.         self.ammo_shells=self.ammo_shells-item.ammo_shells;
  97.         item.classname="weapon_supershotgun";
  98.     } else if (ax==4) {
  99.         if (!(self.items & IT_NAILGUN)) return;
  100.         item = spawn();
  101.         item.owner = self;
  102.         item.items = IT_NAILGUN;
  103.         self.items = self.items - IT_NAILGUN;
  104.         if (self.weapon==IT_NAILGUN) self.weapon=W_BestWeapon();
  105.         setmodel (item, "progs/g_nail.mdl");
  106.         setsize (item, '-16 -16 0', '16 16 56');
  107.         item.touch = BackpackTouch;
  108.         if (self.ammo_nails < 20)
  109.             item.ammo_nails = self.ammo_nails;
  110.         else    item.ammo_nails = 20;
  111.         self.ammo_nails=self.ammo_nails-item.ammo_nails;
  112.         item.classname="weapon_nailgun";
  113.     } else if (ax==5) {
  114.         if (!(self.items & IT_SUPER_NAILGUN)) return;
  115.         item = spawn();
  116.         item.owner = self;
  117.         item.items = IT_SUPER_NAILGUN;
  118.         self.items = self.items - IT_SUPER_NAILGUN;
  119.         if (self.weapon==IT_SUPER_NAILGUN) self.weapon=W_BestWeapon();
  120.         setmodel (item, "progs/g_nail2.mdl");
  121.         setsize (item, '-16 -16 0', '16 16 56');
  122.         item.touch = BackpackTouch;
  123.         if (self.ammo_nails < 20) item.ammo_nails = self.ammo_nails;
  124.         else    item.ammo_nails = 20;
  125.         self.ammo_nails=self.ammo_nails-item.ammo_nails;
  126.         item.classname="weapon_supernailgun";
  127.     } else if (ax==6) {
  128.         if (!(self.items & IT_GRENADE_LAUNCHER)) return;
  129.         item = spawn();
  130.         item.owner = self;
  131.         item.items = IT_GRENADE_LAUNCHER;
  132.         self.items = self.items - IT_GRENADE_LAUNCHER;
  133.         if (self.weapon==IT_GRENADE_LAUNCHER) self.weapon=W_BestWeapon();
  134.         setmodel (item, "progs/g_rock.mdl");
  135.         setsize (item, '-16 -16 0', '16 16 56');
  136.         item.touch = BackpackTouch;
  137.         if (self.ammo_rockets < 10) item.ammo_rockets = self.ammo_rockets;
  138.         else    item.ammo_rockets = 10;
  139.         self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
  140.         item.classname="weapon_grenadelauncher";
  141.     } else if (ax==7) {
  142.         if (!(self.items & IT_ROCKET_LAUNCHER)) return;
  143.         item = spawn();
  144.         item.owner = self;
  145.         item.items = IT_ROCKET_LAUNCHER;
  146.         self.items = self.items - IT_ROCKET_LAUNCHER;
  147.         if (self.weapon==IT_ROCKET_LAUNCHER) self.weapon=W_BestWeapon();
  148.         setmodel (item, "progs/g_rock2.mdl");
  149.         setsize (item, '-16 -16 0', '16 16 56');
  150.         item.touch = BackpackTouch;
  151.         if (self.ammo_rockets < 10) item.ammo_rockets = self.ammo_rockets;
  152.         else    item.ammo_rockets = 10;
  153.         self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
  154.         item.classname="weapon_rocketlauncher";
  155.     } else if (ax==8) {
  156.         if (!(self.items & IT_LIGHTNING)) return;
  157.         item = spawn();
  158.         item.owner = self;
  159.         item.items = IT_LIGHTNING;
  160.         self.items = self.items - IT_LIGHTNING;
  161.         if (self.weapon==IT_LIGHTNING) self.weapon=W_BestWeapon();
  162.         setmodel (item, "progs/g_light.mdl");
  163.         setsize (item, '-16 -16 0', '16 16 56');
  164.         item.touch = BackpackTouch;
  165.         if (self.ammo_cells < 10) item.ammo_cells = self.ammo_cells;
  166.         else    item.ammo_cells = 10;
  167.         self.ammo_cells=self.ammo_cells-item.ammo_cells;
  168.         item.classname="weapon_lightning";
  169.     } else if (ax==16) {
  170.         //shells
  171.         if (self.ammo_shells==0) return;
  172.         item = spawn();
  173.         if (self.ammo_shells < 10) item.ammo_shells = self.ammo_shells;
  174.         else    item.ammo_shells = 10;
  175.         item.owner = self;
  176.         self.ammo_shells=self.ammo_shells-item.ammo_shells;
  177.         setmodel (item, "maps/b_shell1.bsp");
  178.         setsize (item, '-16 -16 0', '16 16 56');
  179.         item.touch = BackpackTouch;
  180.         item.classname = "ammo_shells";
  181.     } else if (ax==17) {
  182.         //nails
  183.         if (self.ammo_nails==0) return;
  184.         item = spawn();
  185.         if (self.ammo_nails < 20) item.ammo_nails = self.ammo_nails;
  186.         else    item.ammo_nails = 20;
  187.         item.owner = self;
  188.         self.ammo_nails=self.ammo_nails-item.ammo_nails;
  189.         setmodel (item, "maps/b_nail1.bsp");
  190.         setsize (item, '-16 -16 0', '16 16 56');
  191.         item.touch = BackpackTouch;
  192.         item.classname = "ammo_nails";
  193.     } else if (ax==18) {
  194.         //rockets
  195.         if (self.ammo_rockets==0) return;
  196.         item = spawn();
  197.         if (self.ammo_rockets < 10) item.ammo_rockets=self.ammo_rockets;
  198.         else    item.ammo_rockets = 10;
  199.         item.owner = self;
  200.         self.ammo_rockets=self.ammo_rockets-item.ammo_rockets;
  201.         setmodel (item, "maps/b_rock1.bsp");
  202.         setsize (item, '-16 -16 0', '16 16 56');
  203.         item.touch = BackpackTouch;
  204.         item.classname = "ammo_rockets";
  205.     } else if (ax==19) {
  206.         //cells
  207.         if (self.ammo_cells==0) return;
  208.         item = spawn();
  209.         if (self.ammo_cells < 10) item.ammo_cells = self.ammo_cells;
  210.         else    item.ammo_cells = 10;
  211.         item.owner = self;
  212.         self.ammo_cells=self.ammo_cells-item.ammo_cells;
  213.         setmodel (item, "maps/b_batt1.bsp");
  214.         setsize (item, '-16 -16 0', '16 16 56');
  215.         item.touch = BackpackTouch;
  216.         item.classname = "ammo_cells";
  217.     } else if (ax==32) {
  218.         if (self.armorvalue<1) return;
  219.         sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  220.         item = spawn();
  221.         item.owner = self;
  222.         item.armortype=self.armortype;
  223.         item.armorvalue=self.armorvalue;
  224.         self.armortype=0;
  225.         self.armorvalue=0;
  226.         setmodel (item, "progs/armor.mdl");
  227.         if (item.armortype==0.3) {
  228.             item.skin=0;
  229.             self.items=self.items-IT_ARMOR1;
  230.             item.items=IT_ARMOR1;
  231.             item.classname="item_armor1";
  232.         } else if (item.armortype==0.6) {
  233.             item.skin=1;
  234.             self.items=self.items-IT_ARMOR2;
  235.             item.items=IT_ARMOR2;
  236.             item.classname="item_armor2";
  237.         } else if (item.armortype==0.8) {
  238.             item.skin=2;
  239.             self.items=self.items-IT_ARMOR3;
  240.             item.items=IT_ARMOR3;
  241.             item.classname="item_armorInv";
  242.         }
  243.         setsize (item, '-16 -16 0', '16 16 56');
  244.         item.touch = armor_touch;
  245.     } else return;
  246.     sound (self, CHAN_WEAPON, "weapons/grenade.wav", 1, ATTN_NORM);
  247.     W_SetCurrentAmmo();    //Draw new weapon on screen (in hand)
  248. // set missile speed    
  249.     makevectors (self.v_angle);
  250.     if (self.v_angle_x)
  251.         item.velocity = v_forward*600 + v_up * 200 +
  252.         crandom()*v_right*10 + crandom()*v_up*10;
  253.     else
  254.     {
  255.         item.velocity = aim(self, 10000);
  256.         item.velocity = item.velocity * 600;
  257.     }
  258.     item.origin = self.origin + (item.velocity * 0.0); 
  259.     item.movetype = MOVETYPE_TOSS;
  260. //    so people cant pick it up immediately
  261.     item.nextthink = time + 0.25;
  262.     item.think = SUB_MakePickup;
  263. };
  264.  
  265. //Detonate all pipebombs
  266. void() DetPipeBombs =
  267. {
  268.         local entity    head;
  269.  
  270.         head = find (world,classname,"pipebomb");
  271.         while(head)
  272.         {
  273.                 if(head.owner == self)
  274.                         head.nextthink = time;
  275.             head = find (head,classname,"pipebomb");
  276.         }
  277. };
  278.  
  279. void() PipeBombTouch =
  280. {
  281.     if (other == self.owner)
  282.         return;        // don't explode on owner
  283.     sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);    // bounce sound
  284.     if (self.velocity == '0 0 0')
  285.         self.avelocity = '0 0 0';
  286. };
  287.  
  288. void() W_FirePipeBomb =
  289. {
  290.     local    entity missile, mpuff;
  291.     if(self.ammo_rockets < 1)    // have to have ammo
  292.       return;
  293.     self.currentammo = self.ammo_rockets = self.ammo_rockets - 1;
  294.     self.punchangle_x=-2;
  295.     missile = spawn ();
  296.     missile.owner = self;
  297.     missile.movetype = MOVETYPE_BOUNCE;
  298.     missile.solid = SOLID_BBOX;
  299.     missile.classname = "pipebomb";
  300.     makevectors (self.v_angle);
  301.     if (self.v_angle_x) missile.velocity = 
  302.     v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
  303.     else {
  304.         missile.velocity = aim(self, 10000);
  305.         missile.velocity = missile.velocity * 600;
  306.         missile.velocity_z = 200;
  307.     }
  308.     missile.avelocity = '300 300 300';
  309.     missile.angles = vectoangles(missile.velocity);
  310.     missile.touch = PipeBombTouch;
  311.     missile.think = GrenadeExplode;
  312.     setmodel (missile, "progs/grenade.mdl");
  313.     setsize (missile, '0 0 0', '0 0 0');        
  314.     setorigin (missile, self.origin);
  315.     //pipe bombs explode after 5 mins by default
  316.     missile.nextthink=time+300;
  317. };
  318. // end pipebombs
  319.  
  320.  
  321. entity() LightFindTarget = {  //this routine based on function by VHOLD
  322.     local entity head, selected;
  323.     local float dist;
  324.     dist = 100000;
  325.     selected = world;
  326.     head = findradius(self.origin, 100000);
  327.     while(head) { 
  328.         if ((((coop) && (head.classname != "player")) || (!coop)) &&
  329.              (((teamplay==1 || teamplay==2 || teamplay==7) &&
  330.              (head.team != self.owner.team)) || (teamplay!=1 || teamplay!=7)) && 
  331.              ((head.health > 1) && (head != self) && (head != self.owner)) &&
  332.              (!(head.items & IT_INVISIBILITY ))) {
  333.             traceline(self.origin,head.origin,TRUE,self);
  334.             if ((trace_fraction==1) && (vlen(head.origin-self.origin) < dist)) {
  335.             selected = head;
  336.             dist = vlen(head.origin - self.origin);
  337.             }
  338.         }    
  339.         head = head.chain;
  340.     }
  341.     return selected;
  342. };
  343.  
  344. void(vector p1, vector p2, entity from, float damage) LightningStun =
  345. {
  346.     local entity            e1, e2;
  347.     local vector            f;
  348.  
  349.     f = p2 - p1;
  350.     normalize (f);
  351.     f_x = 0 - f_y;
  352.     f_y = f_x;
  353.     f_z = 0;
  354.     f = f*16;
  355.  
  356.     e1 = e2 = world;
  357.  
  358.     traceline (p1, p2, FALSE, self);
  359.     if (trace_ent.takedamage)
  360.     {
  361.         particle (trace_endpos, '0 0 100', 225, damage*4);
  362.         if (trace_ent.th_pain) {
  363.             trace_ent.th_pain (trace_ent,damage);
  364.         // nightmare mode monsters don't go into pain frames often
  365.             if (skill == 3) trace_ent.pain_finished = time + 5;          
  366.         }
  367.         if (self.classname == "player")
  368.         {
  369.             if (other.classname == "player")
  370.                 trace_ent.velocity_z = trace_ent.velocity_z + 400;
  371.         }
  372.     }
  373.     e1 = trace_ent;
  374.  
  375.     traceline (p1 + f, p2 + f, FALSE, self);
  376.     if (trace_ent != e1 && trace_ent.takedamage)
  377.     {
  378.         particle (trace_endpos, '0 0 100', 225, damage*4);
  379.         if (trace_ent.th_pain) {
  380.             trace_ent.th_pain (trace_ent,damage);
  381.         // nightmare mode monsters don't go into pain frames often
  382.             if (skill == 3) trace_ent.pain_finished = time + 5;          
  383.         }
  384.     }
  385.     e2 = trace_ent;
  386.  
  387.     traceline (p1 - f, p2 - f, FALSE, self);
  388.     if (trace_ent != e1 && trace_ent != e2 && trace_ent.takedamage)
  389.     {
  390.         particle (trace_endpos, '0 0 100', 225, damage*4);
  391.         if (trace_ent.th_pain) {
  392.             trace_ent.th_pain (trace_ent,damage);
  393.         // nightmare mode monsters don't go into pain frames often
  394.             if (skill == 3) trace_ent.pain_finished = time + 5;          
  395.         }
  396.     }
  397. };
  398.  
  399. void() CastMinionLightning =
  400. {
  401.     local    vector    org, dir;
  402.     
  403.     self.effects = self.effects | EF_MUZZLEFLASH;
  404.  
  405.     ai_face ();
  406.  
  407.     org=self.origin;
  408.  
  409.     dir = self.enemy.origin + '0 0 16' - org;
  410.     dir = normalize (dir);
  411.  
  412.     traceline (org, self.origin + dir*600, TRUE, self);
  413.  
  414.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  415.     WriteByte (MSG_BROADCAST, TE_LIGHTNING1);
  416.     WriteEntity (MSG_BROADCAST, self);
  417.     WriteCoord (MSG_BROADCAST, org_x);
  418.     WriteCoord (MSG_BROADCAST, org_y);
  419.     WriteCoord (MSG_BROADCAST, org_z);
  420.     WriteCoord (MSG_BROADCAST, trace_endpos_x);
  421.     WriteCoord (MSG_BROADCAST, trace_endpos_y);
  422.     WriteCoord (MSG_BROADCAST, trace_endpos_z);
  423.     LightningStun (org, trace_endpos, self.owner, 40);
  424. };
  425.  
  426. //Minion AI
  427. void() MinionThink = {
  428.     local vector dir, vtemp;
  429.     local string s;
  430.     if ((self.owner.flags & FL_HASMINION)==0) {
  431.         remove(self);
  432.         return;    
  433.     }
  434.     self.enemy = self.owner;
  435.     if (self.enemy != world) {
  436.     vtemp = self.enemy.origin + '0 0 10';
  437.        dir = normalize(vtemp - self.origin + '0 0 25');
  438.        self.velocity = dir * 200;
  439.         self.angles = vectoangles(self.velocity);
  440.     }
  441.     self.enemy=LightFindTarget();
  442.     if (self.enemy) {
  443.      if (self.ammo_cells > 1) {
  444.     self.currentammo = self.ammo_cells =self.ammo_cells - 1; 
  445.     CastMinionLightning();
  446.     sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
  447.      } else { 
  448.     self.owner.flags = self.owner.flags - (FL_HASMINION & self.owner.flags); 
  449.     remove(self);
  450.     return;
  451.     }
  452.     }
  453.     self.nextthink = time + 1;
  454.         self.think=MinionThink;
  455. };
  456.  
  457. //Create the minion
  458. void(vector vec) Minion = 
  459. {   
  460.     sound (self, CHAN_WEAPON, "items/damage3.wav", 1, ATTN_NORM);
  461.     vec = normalize(vec);
  462.     newmis = spawn();
  463.     newmis.owner = self;
  464.     newmis.classname = "electricminion";
  465.     newmis.movetype = MOVETYPE_NOCLIP;
  466. //    newmis.movetype = MOVETYPE_FLY;
  467.     newmis.solid = SOLID_NOT;
  468.     newmis.effects = EF_DIMLIGHT;
  469.     newmis.ammo_cells = 40;
  470.     newmis.items = IT_LIGHTNING;
  471.     setmodel (newmis, "progs/quaddama.mdl");
  472.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);  
  473.     setorigin (newmis, self.origin + '0 0 25');// v_forward*8 + '0 0 16');
  474.     newmis.velocity = aim(self, 1000);
  475.     newmis.velocity = newmis.velocity * 1;
  476.     newmis.angles = vectoangles(newmis.velocity);
  477.     newmis.enemy = world;
  478.      newmis.nextthink = time + 2;
  479.     newmis.think = MinionThink;
  480. };
  481.  
  482. //Fire the minion with your gun
  483. void() W_FireMinion =
  484. {   
  485.     if ((self.ammo_cells < 80) || (self.flags & FL_HASMINION)) return;
  486.     //maybe add sound for failure?
  487.     sound (self, CHAN_AUTO, "weapons/lstart.wav", 1, ATTN_NORM);
  488.     self.effects = self.effects | EF_MUZZLEFLASH;
  489.     self.currentammo = self.ammo_cells = self.ammo_cells - 80;
  490.     self.flags = self.flags + FL_HASMINION;
  491.     Minion(self.enemy.origin - self.origin);
  492. };
  493.  
  494. //after a minute, hologram disappears
  495. void() Holothink = { 
  496.   self.owner.numholo = self.owner.numholo - 1;
  497.   sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM);
  498.   remove(self);
  499.    
  500. };
  501.  
  502. //Create a hologram
  503. void(vector vec) Hologram = {    
  504.     if (self.flags & FL_OBSERVER) return;
  505.     sound (self, CHAN_WEAPON, "enforcer/enfire.wav", 1, ATTN_NORM); 
  506.     vec = normalize(vec);
  507.     
  508.     newmis = spawn();
  509.     newmis.owner = self;
  510.     newmis.classname = "hologram";
  511.     newmis.solid = SOLID_NOT;
  512.     setmodel (newmis, self.model);
  513.     newmis.skin=self.skin;
  514.     newmis.frame=self.frame;
  515.     newmis.colormap=self.colormap;
  516.     newmis.modelindex=self.modelindex;
  517.  
  518.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);
  519.         
  520.     setorigin (newmis, self.origin);
  521.     newmis.velocity = aim(self, 1000);
  522.     newmis.velocity = newmis.velocity * 1;
  523.     newmis.angles = vectoangles(newmis.velocity);
  524.     newmis.nextthink = time + 60;
  525.     newmis.think = Holothink;
  526. };
  527.  
  528. //Fire the Hologram
  529. void() W_FireHolo =
  530.     if ((self.ammo_cells < 12) || (self.numholo > 2)) return;
  531.  
  532.     self.effects = self.effects | EF_MUZZLEFLASH;
  533.     self.currentammo = self.ammo_cells = self.ammo_cells - 12;
  534.     self.numholo = self.numholo + 1;
  535.     Hologram(self.enemy.origin - self.origin);
  536. };
  537.  
  538.  
  539. //Become an Observer
  540. void() Observer =
  541. {
  542.     self.items = self.items | (IT_INVULNERABILITY + IT_INVISIBILITY); 
  543.     self.solid = SOLID_NOT;
  544.     centerprint(self,"OBSERVER MODE"); 
  545.      self.flags = self.flags | (FL_OBSERVER);   
  546.     self.flags = self.flags - (self.flags & (FL_HASMINION));
  547.     self.movetype=MOVETYPE_NOCLIP;
  548.     self.frags=self.frags - 1;
  549.     // Detonate Pipe Bombs so person cant use them later
  550.     DetPipeBombs();
  551.     DropFlagCheck(TRUE);
  552.     bprint("\n");
  553.     bprint(self.netname); 
  554.     bprint(" ");
  555.     bprint("is now an observer.");   
  556.     bprint("\n");
  557.     setmodel(self,"");
  558. /*
  559.     self.flags=self.flags | FL_SWIM | FL_INWATER;
  560.     self.watertype=CONTENT_WATER;
  561.     self.waterlevel=1;
  562. */
  563. };          
  564.  
  565. //set the grenade timer based on impulses 53 and 54
  566. void ()SetGrenadeTimer = {
  567.     local string s;
  568.     local float iv; 
  569.     if (self.impulse==53){
  570.         if (self.grenadetimer==0.5) iv=0;
  571.         else iv= -0.5;
  572.         if (self.grenadetimer >5) iv = -1;
  573.         if (self.grenadetimer >20) iv= -5;
  574.         if (self.grenadetimer >60) iv= -15;
  575.         if (self.grenadetimer >120) iv= -30;
  576.     } else {
  577.         iv=0.5;
  578.         if (self.grenadetimer>=5) iv=1;
  579.         if (self.grenadetimer>=15) iv=5;
  580.         if (self.grenadetimer >=60) iv=15;
  581.         if (self.grenadetimer >=120) iv=30;
  582.         if (self.grenadetimer==300) iv=0;
  583.     }
  584.     self.grenadetimer=self.grenadetimer+iv;
  585.     if (!self.grenadetimer) self.grenadetimer=0.5;
  586.     sprint(self,"Grenade Timer: ");
  587.     s=ftos(self.grenadetimer);
  588.     sprint(self,s);
  589.     sprint(self,"\n");
  590. };
  591.  
  592. //If player has lightning gun and less than 50 cells, the gain a cell
  593. void ()CheckPowerRegen = {
  594.     if(self.nextregen <= time){
  595.         if((self.items & IT_LIGHTNING) && (self.ammo_cells < 50)){
  596.             self.ammo_cells=self.ammo_cells+1;
  597.             if (self.weapon==IT_LIGHTNING) self.currentammo=self.ammo_cells;
  598.         }
  599.         self.nextregen=time+5;
  600.     }    
  601. };
  602.  
  603. void() W_PushEnemy = {
  604.     local    vector    source;
  605.     local vector push;
  606.     source = self.origin + '0 0 16';
  607.     makevectors(self.angles);
  608.     traceline (source, source + v_forward*128, FALSE, self);
  609.     v_forward_z=0;
  610.     if (trace_fraction!=1.0)    
  611.         if (trace_ent.takedamage==DAMAGE_AIM){
  612.             //watch out what you move. should this be just players?
  613.             if (trace_ent.flags & FL_ONGROUND)
  614.                 
  615.                 trace_ent.flags=trace_ent.flags-FL_ONGROUND;
  616.             sound (self, CHAN_WEAPON, "player/plyrjmp8.wav", 1, ATTN_NORM);
  617.             push=(((v_forward*64)-(self.origin + '0 0 -32' - trace_ent.origin))*4);
  618.             push_z=push_z+80;
  619.             if (self.super_damage_finished > time) push=push*4;
  620.             trace_ent.velocity=trace_ent.velocity+push;
  621.         }
  622. };
  623.  
  624. void(vector bolt_org, vector bolt_dir, float spawn_num) LightningBounce =
  625. {
  626.     local entity tempent;
  627.     local vector old_endpos;
  628.  
  629.     if (spawn_num < 1)        
  630.         return;
  631.     tempent=spawn();
  632.     tempent.origin = bolt_org;
  633.     setorigin(tempent,bolt_org);
  634.     setmodel(tempent,"progs/grenade.mdl");
  635.     tempent.v_angle = bolt_dir;
  636.     tempent.angles = vectoangles(tempent.v_angle);
  637.     
  638.     traceline (bolt_org, bolt_org + bolt_dir * 600, FALSE, self);
  639.  
  640.     old_endpos = trace_endpos + bolt_dir * 4;
  641.     
  642.     bolt_dir_x = bolt_dir_x * (((0 - 2) * fabs(trace_plane_normal_x)) + 1);
  643.     bolt_dir_y = bolt_dir_y * (((0 - 2) * fabs(trace_plane_normal_y)) + 1);
  644.     bolt_dir_z = bolt_dir_z * (((0 - 2) * fabs(trace_plane_normal_z)) + 1);
  645.  
  646.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  647.     WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
  648.     WriteEntity (MSG_BROADCAST, tempent);
  649.     WriteCoord (MSG_BROADCAST, bolt_org_x);
  650.     WriteCoord (MSG_BROADCAST, bolt_org_y);
  651.     WriteCoord (MSG_BROADCAST, bolt_org_z);
  652.     WriteCoord (MSG_BROADCAST, trace_endpos_x);
  653.     WriteCoord (MSG_BROADCAST, trace_endpos_y);
  654.     WriteCoord (MSG_BROADCAST, trace_endpos_z);
  655.     
  656.     LightningDamage (bolt_org, old_endpos, self, 15*spawn_num);
  657.  
  658.     bolt_dir_x = bolt_dir_x + 0.05 * crandom();
  659.     bolt_dir_y = bolt_dir_y + 0.05 * crandom();
  660.     bolt_dir_z = bolt_dir_z + 0.05 * crandom();
  661.  
  662.     LightningBounce(old_endpos, bolt_dir, spawn_num - 1);
  663.     
  664.     remove(tempent);
  665. };
  666.  
  667. void() W_FireSuperLightning =
  668. {
  669.     local float cells;
  670.     local vector org;
  671.     if (self.ammo_cells < 3)
  672.     {
  673.         self.weaponnum=0;
  674.         self.weapon = W_BestWeapon ();
  675.         W_SetCurrentAmmo ();
  676.         return;
  677.     }
  678.  
  679. // explode if under water
  680.     if (self.waterlevel > 1)
  681.     {
  682.         cells=self.ammo_cells;
  683.         self.ammo_cells = 0;
  684.         T_RadiusDamage (self, self, 35*cells, world);
  685.         W_SetCurrentAmmo ();
  686.         return;
  687.     }
  688.  
  689.     if (self.t_width < time)
  690.     {
  691.         sound (self, CHAN_WEAPON, "weapons/lhit.wav", 1, ATTN_NORM);
  692.         self.t_width = time + 0.6;
  693.     }
  694.     
  695.     self.punchangle_x = -2;
  696.  
  697.     self.currentammo = self.ammo_cells = self.ammo_cells - 3;
  698.  
  699.     org=self.origin+'0 0 16';
  700.     traceline(org,org+v_forward*600,TRUE,self);
  701.     
  702.     makevectors(self.v_angle);
  703.  
  704.     self.attack_finished=time + 2;
  705.     LightningBounce(org, v_forward, 3);
  706. };
  707.  
  708. void() W_Remember =
  709. {
  710.     self.pos1 = self.origin;
  711.     self.pos2 = self.angles;
  712.     sound (self, CHAN_WEAPON, "misc/basekey.wav", 1, ATTN_NORM);
  713.     sprint (self, "Location Stored\n");
  714. };
  715.  
  716. // void(vector org) spawn_tfog;
  717. // void() tdeath_touch;
  718. void(vector org, entity death_owner) spawn_tdeath;
  719.  
  720. void() W_Teleport =
  721. {
  722.     if (self.ammo_cells < 10)
  723.     {
  724.         sprint(self,"Need 10 cells to teleport.\n");
  725.         return;
  726.     }
  727.     if (teamplay == 7)
  728.     {
  729.         sprint(self,"Teleporting disabled in Capture The Flag.\n");
  730.         return;
  731.     }
  732.     if (!(self.pos1 == '0 0 0'))
  733.     {
  734.     self.currentammo = self.ammo_cells = self.ammo_cells - 10;
  735.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  736.     WriteByte (MSG_BROADCAST, TE_TELEPORT);
  737.     WriteCoord (MSG_BROADCAST, self.origin_x);
  738.     WriteCoord (MSG_BROADCAST, self.origin_y);
  739.     WriteCoord (MSG_BROADCAST, self.origin_z);
  740.     sound (self, CHAN_WEAPON, "misc/r_tele4.wav", 1, ATTN_NORM);
  741.     spawn_tdeath(self.pos1, self);
  742.     self.origin = self.pos1;
  743.     self.angles = self.pos2;
  744.     self.fixangle = 1;
  745.     
  746.     sound (self, CHAN_WEAPON, "misc/r_tele3.wav", 1, ATTN_NORM);
  747.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  748.     WriteByte (MSG_BROADCAST, TE_TELEPORT);
  749.     WriteCoord (MSG_BROADCAST, self.origin_x);
  750.     WriteCoord (MSG_BROADCAST, self.origin_y);
  751.     WriteCoord (MSG_BROADCAST, self.origin_z);
  752.     }
  753.     else sprint(self,"No location stored.\n");
  754. };
  755.  
  756. void () W_TripExplode =
  757. {
  758.     self.owner = self.dmg_inflictor;
  759.     T_RadiusDamage (self, self.owner, 199, self);
  760.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  761.     WriteByte (MSG_BROADCAST, TE_EXPLOSION);
  762.     WriteCoord (MSG_BROADCAST, self.origin_x);
  763.     WriteCoord (MSG_BROADCAST, self.origin_y);
  764.     WriteCoord (MSG_BROADCAST, self.origin_z);
  765.     BecomeExplosion ();
  766. };
  767.  
  768. void() W_TripActivate =
  769. {
  770.     local vector org;
  771.     local vector des;
  772.     local entity found;
  773.     local entity tempent;
  774.  
  775.     local float min_dist;
  776.  
  777.     org = self.origin;
  778.     des = self.pos1;
  779.  
  780.     traceline(org, des, FALSE, self);
  781.     
  782.     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
  783.     WriteByte (MSG_BROADCAST, TE_LIGHTNING2);
  784.     WriteEntity (MSG_BROADCAST, self);
  785.     WriteCoord (MSG_BROADCAST, org_x);
  786.     WriteCoord (MSG_BROADCAST, org_y);
  787.     WriteCoord (MSG_BROADCAST, org_z);
  788.     WriteCoord (MSG_BROADCAST, trace_endpos_x);
  789.     WriteCoord (MSG_BROADCAST, trace_endpos_y);
  790.     WriteCoord (MSG_BROADCAST, trace_endpos_z);
  791.  
  792.     self.health = self.health - 1;
  793.     
  794.     if (trace_endpos != des && self.health > 3) 
  795.         self.health = 1;
  796.     
  797.     if (self.health == 1)
  798.         sound (self, CHAN_WEAPON, "misc/talk.wav", 1, ATTN_NORM);
  799.  
  800.     if (self.health <= 0)
  801.     {
  802.         self.think = W_TripExplode;
  803.         self.nextthink = time;
  804.     }
  805.     else
  806.     {
  807.         self.think = W_TripActivate;
  808.         self.nextthink = time + 0.15;
  809.     }
  810. };
  811.  
  812.  
  813. void() W_TripWait =
  814. {
  815.     local entity oldself;
  816.     if(other.health) {
  817.         remove(self);
  818.         return;
  819.     }
  820.     self.owner.attack_finished = time + 1;
  821.     self.owner.currentammo=self.owner.ammo_rockets = self.owner.ammo_rockets - 5;
  822.     self.owner.items=self.owner.items-(self.owner.items & IT_ROCKET_LAUNCHER);
  823.     oldself=self;
  824.     self=self.owner;
  825.     self.weapon=W_BestWeapon();
  826.     W_SetCurrentAmmo();
  827.     self=oldself;
  828.     setmodel(self,"progs/missile.mdl");
  829.     self.angles = self.velocity;
  830.     self.velocity = '0 0 0';
  831.     self.movetype = MOVETYPE_NONE;
  832.     setsize (self, '0 0 0', '0 0 0');
  833.     sound (self, CHAN_WEAPON, "misc/basekey.wav", 1, ATTN_NORM);
  834.     self.dmg_inflictor = self.owner;
  835.     traceline (self.origin, self.origin - self.angles*6000, FALSE, self);
  836.     self.pos1 = trace_endpos;
  837.     self.health = 1200 ;  // 3mins  
  838.     self.owner = self;
  839.     self.think = W_TripActivate;
  840.     self.nextthink = time + 1.5;
  841. };
  842.  
  843. void() W_FireTripBomb =
  844. {
  845.     local vector dir;
  846.     if (self.ammo_rockets < 5)
  847.     {
  848.         sprint (self, "Need 5 rockets to place tripbomb\n");
  849.         return;
  850.     }
  851.     dir = aim(self,1000);
  852.  
  853.     newmis = spawn ();
  854.     newmis.owner = self;
  855.     newmis.movetype = MOVETYPE_FLYMISSILE;
  856.     newmis.solid = SOLID_BBOX;
  857.     newmis.angles = vectoangles(dir);
  858.     newmis.touch = W_TripWait;
  859.     newmis.classname="tripbomb";
  860.     newmis.takedamage = DAMAGE_NO;
  861.     newmis.think = SUB_Remove;
  862.     newmis.nextthink = time + 0.05;
  863.     setsize (newmis, VEC_ORIGIN, VEC_ORIGIN);               
  864.     setorigin (newmis, self.origin);
  865.     newmis.velocity = dir * 5000;
  866. };
  867.  
  868.  
  869. void(entity targ,entity inflictor, float vel) DamageGib = {
  870.     local entity oldself;
  871.     local float rnum;
  872.     rnum = random();
  873.     if ((vel < 10) || (inflictor.weapon == IT_LIGHTNING)) return;
  874.     oldself=self;
  875.     self=targ;
  876.     if(vel < 50) ThrowGib("progs/gib1.mdl",-2 * vel);
  877.     else if(vel < 90) {
  878.         if(rnum < 0.5){
  879.             ThrowGib("progs/gib1.mdl",-2 * vel);
  880.             ThrowGib("progs/gib1.mdl",-2 * vel);
  881.         } else {
  882.             ThrowGib("progs/gib3.mdl",-2 * vel);
  883.         }
  884.     } else if(vel < 130) {
  885.         ThrowGib("progs/gib1.mdl",-2 * vel);
  886.         ThrowGib("progs/gib3.mdl",-2 * vel);
  887.     } else if(vel < 170) {
  888.         ThrowGib("progs/gib3.mdl",-2 * vel);
  889.         if(rnum < 0.5){
  890.             ThrowGib("progs/gib1.mdl",-2 * vel);
  891.             ThrowGib("progs/gib1.mdl",-2 * vel);
  892.         } else {
  893.             ThrowGib("progs/gib3.mdl",-2 * vel);
  894.         }
  895.     } else if(vel < 210) {
  896.         ThrowGib("progs/gib3.mdl",-2 * vel);
  897.         ThrowGib("progs/gib3.mdl",-2 * vel);
  898.         ThrowGib("progs/gib1.mdl",-2 * vel);
  899.     } else {
  900.         ThrowGib("progs/gib3.mdl",-2 * vel);
  901.         ThrowGib("progs/gib3.mdl",-2 * vel);
  902.         ThrowGib("progs/gib1.mdl",-2 * vel);
  903.         ThrowGib("progs/gib1.mdl",-2 * vel);
  904.     }
  905.     self=oldself;
  906. };
  907.  
  908. void() SetAliases = {
  909.     if(newclient==world) return;
  910.     stuffcmd(newclient,"alias INC_SKIN impulse 200\n");
  911.     stuffcmd(newclient,"alias DEC_SKIN impulse 201\n");
  912.     stuffcmd(newclient,"alias OBSERVER impulse 210\n");
  913.     stuffcmd(newclient,"alias UNPLACE impulse 17\n");
  914.     stuffcmd(newclient,"alias DROP_FLAG impulse 18\n");
  915.     stuffcmd(newclient,"alias CYCLE_TEAMPLAY impulse 19\n");
  916.     stuffcmd(newclient,"alias DETONATE impulse 52\n");
  917.     stuffcmd(newclient,"alias DEC_GRENADE_TIMER impulse 53\n");
  918.     stuffcmd(newclient,"alias INC_GRENADE_TIMER impulse 54\n");
  919.     stuffcmd(newclient,"alias TOSS_WEAPON impulse 55\n");
  920.     stuffcmd(newclient,"alias TOSS_AMMO impulse 56\n");
  921.     stuffcmd(newclient,"alias TOSS_ARMOR impulse 57\n");
  922.     stuffcmd(newclient,"alias HOLO impulse 58\n");
  923.     newclient=world;    
  924. };
  925.  
  926. void(entity targ,entity attacker) CreateZombie = {
  927.     local entity ent;
  928.     setmodel(targ,"progs/gib3.mdl");
  929.     ent=self;
  930.     self=spawn();
  931.     setorigin(self,targ.origin);
  932.     self.solid = SOLID_SLIDEBOX;
  933.     self.movetype = MOVETYPE_STEP;
  934.     setmodel (self, "progs/zombie.mdl");
  935.     setsize (self, '-16 -16 -24', '16 16 40');
  936.     self.friend=attacker;
  937.     self.health = 65;
  938.     self.classname = "monster_zombie";
  939.     self.th_stand = zombie_stand1;
  940.     self.th_walk = zombie_walk1;
  941.     self.th_run = zombie_run1;
  942.     self.th_pain = zombie_pain;
  943.     self.th_die = zombie_die;
  944.     self.th_missile = zombie_missile;
  945.     walkmonster_start_go();
  946.     T_Damage(self,ent,ent,60);
  947.     self=ent;
  948. };
  949.  
  950.